/*
 * time_trigger.h
 *
 *  Created on: Jul 20, 2022
 *      Author: fanlida
 */
 
#ifndef __TIME_TRIGGER_H__
#define __TIME_TRIGGER_H__


#define		CycleMode				0  		//循环触发模式
#define		OneShotHodeMode			1		//受控单次触发保持模式
#define		OneShotMode				2		//受控单次触发模式
#define		OneShotMultipleMode		3		//受控单次触发多次执行

#define		STATE_ON				1
#define		STATE_OFF				0

typedef struct 
{
	unsigned int level 	    : 1; 	//状态 开/关
	unsigned int timeout	: 31;	//状态持续时间
}TimeTriggerState_t;

typedef struct 
{
	unsigned char statenum  : 8;  	//运行方案链表状态数量 最大256
	unsigned char statecnt  : 8;  	//运行方案链表状态计数 最大256
	unsigned char ctrtype	: 3;  	//周期 0-循环 1-执行一次保持  2-执行一次  3-受控单次触发多次执行 见宏定义
	unsigned char ctrlcmd 	: 1; 	//使能
	unsigned char runnum	: 6;	//受控单次触发多次执行模式下有效 执行次数目标值  
	unsigned char runcnt	: 6;	//受控单次触发多次执行模式下有效 执行次数计数值
}TimeTriggerParam_t;


//GPIO驱动程序
typedef void (*execute_driver)(unsigned char state);

struct TimeTriggerIf_t
{
	struct TimeTriggerIf_t	*next;
	TimeTriggerState_t		statenow;				//当前任务状态+任务状态持续时间
	TimeTriggerState_t		*statelist; 			//选择的任务运行方案链表地址
	TimeTriggerParam_t		param;					//任务运行参数
	execute_driver			driver;					//执行驱动函数
};

//时间触发功能注册函数
void TimeTriggerAdd(struct TimeTriggerIf_t **pheadlist,struct TimeTriggerIf_t* ptti, const TimeTriggerState_t *pstate, unsigned char statenum, unsigned char ctrtype, execute_driver driver);
//时间触发功能总处理函数
void TimeTriggerHanleAll(struct TimeTriggerIf_t **pinhandle);

#endif


